#!/usr/bin/env python
# coding: utf-8

# In[1]:


grp5 = {
    "name": "g5",
    "nb": 15,
    "list_etuds": ["isra", "hiba", "ahmed"],
    "math_exam": True,
}
len(grp5)  # --> 4


# In[2]:


grp5["name"]  # --> 'g5'


# In[3]:


grp5["name"] = "G5"  # ecraser la valeur de la clé 'name' par 'G5' au lieu de 'g5'
# --> {'name': 'G5', 'nb': 15, 'list_etuds': ['isra', 'hiba', 'ahmed'], 'math_exam': True}
grp5


# In[4]:


grp5["moy"] = 17.5
grp5[1] = "val1"
grp5["1"] = "val"
grp5[True] = "bjr"
grp5[15.5] = "float"
grp5[(1, 2)] = "float"
grp5[range(1, 20)] = "float"
# --> {'name': 'G5', 'nb': 15, 'list_etuds': ['isra', 'hiba', 'ahmed'], 'math_exam': True, 'moy': 17.5, 1: 'val1', '1': 'val', True: 'bjr', 15.5: 'float', (1, 2): 'float', range(1, 20): 'float'}
grp5


# In[5]:


# --> ['isra', 'hiba', 'ahmed', 'oumaima']
grp5["list_etuds"].append("oumaima")
# --> {'name': 'G5', 'nb': 15, 'list_etuds': ['isra', 'hiba', 'ahmed', 'oumaima'], 'math_exam': True, 'moy': 17.5, 1: 'val1', '1': 'val', True: 'bjr', 15.5: 'float', (1, 2): 'float', range(1, 20): 'float'}
grp5


# In[6]:


# Les clés doivent être immuables. C'est à dire que les clés ne doivent pas être modifiables
# Ces instructions ne sont pas valides et generent des erreurs
grp5[[1, 2]] = "list"
grp5[{"a", 1}] = "abc"
grp5[{"a": 1}] = 10


# In[7]:


"name" in grp5  # 'name' in grp5.keys() #--->True
"khales" in grp5  # --->False
"G5" in grp5  # grp5['khales'] ---> KeyError: 'khales'
if "khales" in grp5:
    grp5["khales"]  # --->
grp5.get("name")  # if 'khales' in grp5:grp5['name']#--->G5
grp5.get("name", "cle mouch mawjoud")  # --->G5
grp5.get("namessssssssss", "cle mouch mawjoud")  # --->cle mouch mawjoud


# In[8]:


# <dict>.pop(<key>[,default]) : supprime la clé <key> et retourne sa valeur. Si la clé n'existe pas, retourne <default> ou lève une exception si <default> n'est pas fourni.
grp5.pop("name")  # supprime la clé 'name' et retourne sa valeur --->'G5'


# In[9]:


str( grp5 )  # --->"{'nb': 15, 'list_etuds': ['isra', 'hiba', 'ahmed'], 'math_exam': True, 'moy': 17.5, 1: 'val1', '1': 'val', True: 'bjr', 15.5: 'float', (1, 2): 'float', range(1, 20): 'float'}"
list( grp5 )  # --->['nb', 'list_etuds', 'math_exam', 'moy', 1, '1', True, 15.5, (1, 2), range(1, 20)]
tuple( grp5 )  # --->('nb', 'list_etuds', 'math_exam', 'moy', 1, '1', True, 15.5, (1, 2), range(1, 20))
set( grp5 )  # --->{1, 15.5, '1', 'nb', 'moy', 'math_exam', (1, 2), True, range(1, 20), 'list_etuds'}


# In[10]:


# --->dict_keys(['nb', 'list_etuds', 'math_exam', 'moy', 1, '1', True, 15.5, (1, 2), range(1, 20)])
grp5.keys()


# In[11]:


d = {
    "etud1": "isra",
    "etud2": "isra",
    "etud3": "hiba",
    "etud4": "isra",
    "etud5": "ahmed",
    "etud6": "isra",
}
list(d.values()).count("isra")  # --->4


# In[12]:


# <dict>.items() : retourne une vue sur les couples (clé, valeur) du dictionnaire.
# --->dict_items([('etud1', 'isra'), ('etud2', 'isra'), ('etud3', 'hiba'), ('etud4', 'isra'), ('etud5', 'ahmed'), ('etud6', 'isra')])
d.items()


# <h4> Parcourir un dictionnaire </h4>
# 

# In[13]:


for k in grp5.keys():
    print(k)


# In[14]:


for k in grp5.values():
    print(k)


# In[15]:


for k in grp5.items():
    print(k)


# In[16]:


# for key,value in grp5.items():
for key, value in grp5.items():
    print(key, value)


# In[17]:


# for hajja in grp5:
#     # print(hajja, 'est une autre cle')
#     print(f'"{hajja}" est une autre cle')

# for key in grp5:
# for key in list(grp5):
# for key in tuple(grp5):
# for key in set(grp5):
for key in grp5.keys():
    # print(key, 'est une autre cle')
    print(f'"{key}" est une autre cle. et sa valeur est {grp5[key]}')


# In[18]:


d1 = {}  # d1=dict() #d1=dict([]) #dictionnaire vide
d1["a"] = 10  # ajouter la cle 'a' avec la valeur 10
d1


# In[19]:


d3 = {
    "a": 1,
    "a": 10,
    "a": 100,
}  # --->{'a': 100} car les cles doivent etre uniques. Et la derniere valeur est prise en compte
d3


# In[20]:


# <dict>.popitem() : supprime la dernière clé et retourne un tuple (clé,valeur)
grp5.popitem()  # --->((1, 2), 'float')


# In[21]:


grp5.pop()  # TypeError: pop expected at least 1 arguments, got 0
grp5.pop( "name" )  # --->KeyError: 'name' # car la cle 'name est supprimée dans la ligne précédente
grp5.pop("name", "en cas mouch mawjoud")  # --->'en cas mouch mawjoud'


# In[22]:


# pour supprimer toutes les clés et leurs valeurs element par element, on peut utiliser la boucle while
while len(grp5) > 0:
    grp5.popitem()


# In[2]:


d0 = {"a": 1, "b": 2, "c": 3}
d1 = {"c": 30, "e": 40, "f": 50}
d0.update(d1)
d0

